package Spider;

import Spider.Model.WeatherInfo;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;

import java.util.List;

public class WeatherInfoProcessor implements PageProcessor {

    private Site site = Site.me()
            .setDomain("http://rp5.ru")
            .setSleepTime(1000)
            .setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36");

    @Override
    public void process(Page page) {
        // todo 根据时间修改获取今日天气表格数据
        //n 是今天夜里 n2 是明天夜里 d2 是明天白天 d是今天白天

        /*
          div-ftab 气象展示面板
          正常情况下，此处仅返回只有一条内容的数组
         */
        List<Selectable> lists = page.getHtml().xpath("div[@id='ftab_1_content']").nodes();

        System.out.println("url:" + page.getUrl() + " ======= 获取页面信息 =======");

        // 获取内容
        Selectable formContent = lists.get(0);

        // 获取第一部分信息
        List<Selectable> infoPart1 = formContent.xpath("td[@class='n']").nodes();

        // 抽取当前时间
        List<Selectable> timeInfo = infoPart1.get(0).regex("[0-9]+").nodes();

        int currentHour = Integer.parseInt(String.valueOf(timeInfo.get(1)));
        System.out.println("url:" + page.getUrl() + " 当前时间 : " + currentHour + "点");

        // 云量信息
        List<Selectable> cloudPart = infoPart1.get(1).xpath("div[@class='cc_0']").nodes();
        List<Selectable> cloudInfo = cloudPart.get(0).regex("[\\u4e00-\\u9fa5]+[0-9%]*").nodes();
        StringBuilder currentCloud = new StringBuilder();

        for (Selectable item : cloudInfo) {
            currentCloud.append(" ").append(item.toString());
        }

        System.out.println("url:" + page.getUrl() + " 云量信息 : " + currentCloud);

        // 天气现象
        List<Selectable> weatherPart = infoPart1.get(2).xpath("div[@class='pr_0']").nodes();
        List<Selectable> weatherInfo = weatherPart.get(0).regex("[\\u4e00-\\u9fa5]+").nodes();
        String currentWeather = weatherInfo.get(0).toString();

        System.out.println("url:" + page.getUrl() + " 天气现象 : " + currentWeather);

        // 气温信息
        List<Selectable> tempPart = infoPart1.get(4).xpath("div[@class='t_0']").nodes();

        List<Selectable> tempInfo1 = tempPart.get(0).regex("[+-]+").nodes(); // 气温正负
        List<Selectable> tempInfo2 = tempPart.get(0).regex("[0-9]+").nodes(); // 气温度数

        String currentTemp = tempInfo1.get(0).toString() + tempInfo2.get(1).toString();

         System.out.println("url:" + page.getUrl() + " 气温信息 : " + currentTemp + "℃");


        // 体表感受温度 infoPart1.get(4)

        // 气压信息
//        System.out.println(infoPart1);
        List<Selectable> pressPart = infoPart1.get(5).xpath("div[@class='p_0']").nodes();
        List<Selectable> pressInfo = pressPart.get(0).regex("[0-9]+").nodes();
        Integer currentPress = Integer.valueOf(pressInfo.get(1).toString());
//        Integer currentPress = 0;

        System.out.println("url:" + page.getUrl() + " 气压信息 : " + currentPress + "毫米汞柱");


        // 湿度信息
        List<Selectable> humidityPart1 = infoPart1.get(6).regex("[0-9]+").nodes();
        List<Selectable> humidityPart2 = infoPart1.get(6).regex("[\\u4e00-\\u9fa5]+").nodes();
        Integer currentHumidityCount = Integer.valueOf(humidityPart1.get(1).toString());
        String currentHumidityDesc = humidityPart2.get(0).toString();

        // System.out.println("湿度信息 : " + currentHumidityCount + "% -- " + currentHumidityDesc);

        // 月相信息 infoPart1.get(7)

        Selectable infoPart2 = formContent.xpath("td[@class='wn']");

        // 风向信息
        Selectable windPart = infoPart2.xpath("div[@class='wv_0']");

        List<Selectable> windInfo = windPart.regex("[\\u4e00-\\u9fa5/0-9]+").nodes();

        String windDesc = windInfo.get(1).toString();
        Integer windSpeed = Integer.valueOf(windInfo.get(3).toString());

        // System.out.println("风向信息 : " + windSpeed + "m/s -- " + windDesc);


        WeatherInfo w = new WeatherInfo(
                currentHour,
                currentCloud.toString(),
                currentWeather,
                currentTemp,
                currentPress,
                currentHumidityDesc,
                currentHumidityCount, windDesc,
                windSpeed
        );

        page.putField(page.getUrl().toString(),w);
    }

    @Override
    public Site getSite() {
        return site;
    }

    public static void main(String[] args) {
        Spider.create(new WeatherInfoProcessor())
                .addPipeline(new TestPipeline())
                .addUrl("http://rp5.ru/咸阳市天气_")
                .addUrl("http://rp5.ru/延安市天气_")
                .addUrl("http://rp5.ru/宝鸡市天气_")
                .addUrl("http://rp5.ru/渭南市天气_")
                .addUrl("http://rp5.ru/西安市天气_")
                .addUrl("http://rp5.ru/蓬莱市天气_")
                .addUrl("http://rp5.ru/天水市天气_")
                .addUrl("http://rp5.ru/栖霞市天气_")
                .addUrl("http://rp5.ru/临汾市天气_")
                .addUrl("http://rp5.ru/莱阳市天气_")
                .addUrl("http://rp5.ru/莱州市天气_")
                .addUrl("http://rp5.ru/龙口市天气_")
                .addUrl("http://rp5.ru/庆阳市天气_")
                .addUrl("http://rp5.ru/平凉市天气_")
                .addUrl("http://rp5.ru/三门峡市天气_")
                .thread(5)
                .run();
    }
}
